import time
import psutil
import GPUtil
from prometheus_client import start_http_server, Summary, Counter, Gauge, Histogram

# 创建指标，使用中文描述

# CPU使用率（Gauge）
CPU_USAGE = Gauge('cpu_usage', 'CPU使用率')
# 内存使用率（Gauge）
MEMORY_USAGE = Gauge('memory_usage', '内存使用率')
# 磁盘使用率（Gauge）
DISK_USAGE = Gauge('disk_usage', '磁盘使用率')
# GPU使用率（Gauge）
GPU_USAGE = Gauge('gpu_usage', '显卡使用率')

# 使用Gauge记录CPU温度
CPU_TEMPERATURE_GAUGE = Gauge('cpu_temperature', 'CPU温度（摄氏度）')
# 使用Summary记录CPU温度
CPU_TEMPERATURE_SUMMARY = Summary('cpu_temperature_summary', 'CPU温度（摄氏度）')

# 总请求计数（Counter）
REQUEST_COUNT = Counter('system_metrics_requests_total', '系统监控请求总数')

# 请求处理时间（Summary）
REQUEST_TIME = Summary('system_metrics_request_duration_seconds', '处理请求所花费的时间（秒）')

def collect_system_metrics():
    # 记录请求计数
    REQUEST_COUNT.inc()

    # 记录请求处理时间
    with REQUEST_TIME.time():
        # 获取CPU使用率
        cpu_usage = psutil.cpu_percent(interval=1)
        CPU_USAGE.set(float(f"{cpu_usage:.2f}"))  # 转换为小数，保留两位小数
        
        # 获取内存使用率
        memory_info = psutil.virtual_memory()
        MEMORY_USAGE.set(float(f"{memory_info.percent:.2f}"))  # 转换为小数，保留两位小数
        
        # 获取磁盘使用率
        disk_info = psutil.disk_usage('/')
        DISK_USAGE.set(float(f"{disk_info.percent:.2f}"))  # 转换为小数，保留两位小数
        
        # 获取GPU使用率
        gpus = GPUtil.getGPUs()
        for gpu in gpus:
            GPU_USAGE.set(float(f"{gpu.load * 100:.2f}"))  # 转换为小数，保留两位小数

        # 模拟CPU温度
        cpu_temperature = 50.0  # 这是一个模拟值，在实际情况下需要从系统获取
        CPU_TEMPERATURE_GAUGE.set(cpu_temperature)  # 使用Gauge记录CPU温度
        CPU_TEMPERATURE_SUMMARY.observe(cpu_temperature)  # 使用Summary记录CPU温度
        
        # 打印处理后的数据
        print(f"CPU: {cpu_usage}%, Memory: {memory_info.percent}%, Disk: {disk_info.percent}%, GPU: {gpu.load * 100 if gpus else 'N/A'}%, CPU Temperature: {cpu_temperature}°C")

if __name__ == '__main__':
    # 启动一个HTTP服务器来暴露指标，端口号为8000
    start_http_server(6000)
    
    # 定期收集系统指标
    while True:
        collect_system_metrics()
        time.sleep(10)  # 每10秒收集一次数据